package to3;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

public class KlantenLijst {

    private List<Klant> klantenLijst = new ArrayList<>();

    
    /* Object serialization start
     * Functies voor het opslaan van het klantenLijst object daarbij ook al zijn attributen
     */
    public KlantenLijst() {
        //bij het aanmaken van de KlantenLijst haal alle data uit het bestand
        FileInputStream in = null;
        try {
            in = new FileInputStream("klanten.dat"); //het bestand waar uit gelezen wordt. Moet aanwezig zijn!
        } catch (FileNotFoundException ex) {
            Logger.getLogger(KlantenLijst.class.getName()).log(Level.SEVERE, null, ex);
        }
        ObjectInputStream s;
        try {
            s = new ObjectInputStream(in); 
            klantenLijst = (List<Klant>) s.readObject(); //leest het object uit de stream
        } catch (IOException | ClassNotFoundException ex) {
            Logger.getLogger(KlantenLijst.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //functie welke dient uit gevoerd te worden bij het bewerken van de klantenLijst
    //saved klantenLijst naar bestand
    public void saveKlantenLijst() {
        FileOutputStream f = null;
        try {           
            f = new FileOutputStream("klanten.dat"); //het bestand waarna geschreven wordt
        } catch (FileNotFoundException ex) { 
            //FILE NOT FOUND EXEPTION
            Logger.getLogger(KlantenLijst.class.getName()).log(Level.SEVERE, null, ex);
        }
        ObjectOutputStream s;
        try {
            s = new ObjectOutputStream(f); 
            s.writeObject(klantenLijst); //stopt het object in de stream (buffered)
            s.flush(); // flush de stream, schijft alle data naar het bestand
        } catch (IOException ex) { 
            Logger.getLogger(KlantenLijst.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    /* 
     * Object serialization einde
     */
    
        
    public KlantenLijst(boolean leesNietUit){
        
    }

    public void addKlant(String klantnr, String voornaam, String achternaam,
            String adres, String woonplaats, String telefoon, String email, String rekeningnr) {
        klantenLijst.add(new Klant(klantnr, voornaam, achternaam, adres, woonplaats, telefoon, email, rekeningnr));
        saveKlantenLijst(); //saved wijzigingen ook naar file
    }

    public void addNewKlant(String voornaam, String achternaam,
            String adres, String woonplaats, String telefoon, String email, String rekeningnr) {
        String klantnr = "";
        while (klantnr.equals("")) {
            klantnr = generateRandomString();
        }
        klantenLijst.add(new Klant(klantnr, voornaam, achternaam, adres, woonplaats, telefoon, email, rekeningnr));
        saveKlantenLijst(); //saved wijzigingen ook naar file
    }

    
    public void clearKlantenLijst() {
        if (klantenLijst.size() > 0) {
            klantenLijst.clear();
            saveKlantenLijst(); //saved wijzigingen ook naar file
        }
    }

    public List<Klant> getKlanten() {
        return klantenLijst;
    }

    public String generateRandomString() {
        String nr = "";
        for (int i = 0; i < 8; ++i) {
            String random = "" + (new Random().nextInt(9));
            nr = nr + random;
        }
        if (checkNr(nr) == false) {
            return nr;
        } else {
            return "";
        }
    }

    public boolean checkNr(String nr) {
        for (Klant k : klantenLijst) {
            if (k.getKlantnr().equals(nr)) {
                return true;
            }
        }
        return false;
    }

    public Klant getKlant(String nr) {
        for (Klant klant : this.klantenLijst) {
            if (klant.getKlantnr().equals(nr)) {
                return klant;
            }
        }
        //Klant niet gevonden
        return new Klant();
    }
    
    public int getIndexOfKlant(Klant klant){
        return klantenLijst.indexOf(klant);
    }
    
    public void setKlant(int index, Klant klant){       
        klantenLijst.set(index, klant);
        saveKlantenLijst();
    }
}